#include <iostream>
using namespace std;
struct S
{
    int *resource;

    S()
    {
        cout << "S constructed" << endl;
        resource = new int{42};
    }
    ~S()
    {
        cout << "S destructed" << endl;
        delete resource;
    }
};
int main()
{
    int *ptr{nullptr};
    {
        S s;              // s 持有资源 s->resource 的所有权
        ptr = s.resource; // ptr 不持有所有权
    }
    // 此处 s 消失后资源会释放
    // ptr 仍然可访问，但资源已释放
    cout << *ptr << std::endl; // 未定义行为
    
    // 1、普通指针在资源管理中的风险
    // 1、double free : 资源被释放两次
    // 2、悬空指针: 资源被释放后，指针仍然指向该资源
    // 3、内存泄漏: 资源未被释放，导致内存泄漏
    return 0;
}
